React Testing Library yordamida React komponentlarini testlashni o'zlashtiring. Foydalanuvchi xulq-atvori va qulayligiga qaratilgan samarali testlarni yozishning eng yaxshi amaliyotlarini o'rganing.
React Testing Library: Global Jamoalar uchun Komponentlarni Testlashning Eng Yaxshi Amaliyotlari
Doimiy rivojlanib borayotgan veb-dasturlash olamida React ilovalaringizning ishonchliligi va sifatini ta'minlash juda muhim. Bu, ayniqsa, turli xil foydalanuvchilar bazasi va maxsus imkoniyatlar talablariga ega loyihalar ustida ishlayotgan global jamoalar uchun dolzarbdir. React Testing Library (RTL) komponentlarni testlash uchun kuchli va foydalanuvchiga yo'naltirilgan yondashuvni taqdim etadi. Amalga oshirish tafsilotlariga e'tibor qaratadigan an'anaviy testlash usullaridan farqli o'laroq, RTL sizni o'z komponentlaringizni foydalanuvchi ular bilan qanday munosabatda bo'lishini sinab ko'rishga undaydi, bu esa yanada mustahkam va qo'llab-quvvatlanadigan testlarga olib keladi. Ushbu keng qamrovli qo'llanma global auditoriyaga mos ilovalarni yaratishga e'tibor qaratgan holda React loyihalaringizda RTL'dan foydalanishning eng yaxshi amaliyotlarini chuqur o'rganadi.
Nima uchun React Testing Library?
Eng yaxshi amaliyotlarga sho'ng'ishdan oldin, nima uchun RTL boshqa testlash kutubxonalaridan ajralib turishini tushunish juda muhim. Mana bir nechta asosiy afzalliklar:
- Foydalanuvchiga yo'naltirilgan yondashuv: RTL komponentlarni foydalanuvchi nuqtai nazaridan testlashni birinchi o'ringa qo'yadi. Siz komponent bilan foydalanuvchi foydalanadigan usullar yordamida o'zaro aloqada bo'lasiz (masalan, tugmalarni bosish, kiritish maydonlariga yozish), bu esa yanada real va ishonchli testlash tajribasini ta'minlaydi.
- Maxsus imkoniyatlarga e'tibor: RTL nogironligi bo'lgan foydalanuvchilarni hisobga olgan holda komponentlarni testlashga undash orqali qulay komponentlar yozishni rag'batlantiradi. Bu WCAG kabi global maxsus imkoniyatlar standartlariga mos keladi.
- Kamroq texnik xizmat: Amalga oshirish tafsilotlarini (masalan, ichki holat, maxsus funksiya chaqiruvlari) testlashdan qochish orqali, RTL testlari kodingizni qayta ishlaganingizda buzilish ehtimoli kamroq bo'ladi. Bu esa qo'llab-quvvatlanishi oson va barqaror testlarga olib keladi.
- Yaxshilangan kod dizayni: RTL'ning foydalanuvchiga yo'naltirilgan yondashuvi ko'pincha yaxshiroq komponent dizayniga olib keladi, chunki siz foydalanuvchilar komponentlaringiz bilan qanday munosabatda bo'lishi haqida o'ylashga majbur bo'lasiz.
- Jamiyat va ekotizim: RTL keng va faol jamiyatga ega bo'lib, ko'plab resurslar, qo'llab-quvvatlash va kengaytmalarni taqdim etadi.
Testlash Muhitini Sozlash
RTL bilan ishlashni boshlash uchun siz testlash muhitini sozlashingiz kerak. Mana, Jest va RTL oldindan sozlangan holda keladigan Create React App (CRA) yordamida asosiy sozlash:
npx create-react-app my-react-app
cd my-react-app
npm install --save-dev @testing-library/react @testing-library/jest-dom
Tushuntirish:
- `npx create-react-app my-react-app`: Create React App yordamida yangi React loyihasini yaratadi.
- `cd my-react-app`: Yangi yaratilgan loyiha katalogiga o'tadi.
- `npm install --save-dev @testing-library/react @testing-library/jest-dom`: Kerakli RTL paketlarini ishlab chiqish bog'liqliklari sifatida o'rnatadi. `@testing-library/react` asosiy RTL funksionalligini ta'minlaydi, `@testing-library/jest-dom` esa DOM bilan ishlash uchun foydali Jest moslashtirgichlarini taqdim etadi.
Agar siz CRA'dan foydalanmayotgan bo'lsangiz, Jest va RTL'ni alohida o'rnatishingiz va Jest'ni RTL'dan foydalanish uchun sozlashingiz kerak bo'ladi.
React Testing Library bilan Komponentlarni Testlashning Eng Yaxshi Amaliyotlari
1. Foydalanuvchi Harakatlariga O'xshash Testlar Yozing
RTL'ning asosiy printsipi komponentlarni foydalanuvchi kabi testlashdir. Bu ichki amalga oshirish tafsilotlariga emas, balki foydalanuvchi nima ko'rishi va nima qilishiga e'tibor qaratishni anglatadi. Elementlarni matni, roli yoki maxsus imkoniyatlar yorliqlari bo'yicha so'rov qilish uchun RTL tomonidan taqdim etilgan `screen` obyektidan foydalaning.
Misol: Tugma bosilishini testlash
Aytaylik, sizda oddiy tugma komponenti bor:
// Button.js
import React from 'react';
function Button({ onClick, children }) {
return ;
}
export default Button;
Uni RTL yordamida qanday testlash mumkinligi:
// Button.test.js
import React from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import Button from './Button';
describe('Button Component', () => {
it('calls the onClick handler when clicked', () => {
const handleClick = jest.fn();
render();
const buttonElement = screen.getByText('Click Me');
fireEvent.click(buttonElement);
expect(handleClick).toHaveBeenCalledTimes(1);
});
});
Tushuntirish:
- `render()`: Tugma komponentini soxta `onClick` ishlovchisi bilan render qiladi.
- `screen.getByText('Click Me')`: Hujjatdan "Click Me" matnini o'z ichiga olgan elementni qidiradi. Foydalanuvchi tugmani shu tarzda aniqlaydi.
- `fireEvent.click(buttonElement)`: Tugma elementida bosish hodisasini simulyatsiya qiladi.
- `expect(handleClick).toHaveBeenCalledTimes(1)`: `onClick` ishlovchisi bir marta chaqirilganligini tasdiqlaydi.
Nima uchun bu amalga oshirish tafsilotlarini testlashdan yaxshiroq: Tasavvur qiling, siz Tugma komponentini boshqa hodisa ishlovchisidan foydalanish yoki ichki holatni o'zgartirish uchun qayta ishlaysiz. Agar siz ma'lum bir hodisa ishlovchisi funksiyasini testlayotgan bo'lsangiz, testingiz buziladi. Foydalanuvchi harakatiga (tugmani bosish) e'tibor qaratish orqali, test qayta ishlashdan keyin ham o'z kuchida qoladi.
2. So'rovlarni Foydalanuvchi Niyatiga Ko'ra Ustuvorlashtiring
RTL elementlarni topish uchun turli xil so'rov usullarini taqdim etadi. Quyidagi so'rovlarni shu tartibda ustuvorlashtiring, chunki ular foydalanuvchilar komponentlaringizni qanday qabul qilishi va ular bilan o'zaro munosabatda bo'lishini eng yaxshi aks ettiradi:
- getByRole: Bu so'rov eng qulay va sizning birinchi tanlovingiz bo'lishi kerak. U elementlarni ularning ARIA rollari (masalan, button, link, heading) asosida topishga imkon beradi.
- getByLabelText: Kiritish maydonlari kabi ma'lum bir yorliq bilan bog'liq elementlarni topish uchun foydalaning.
- getByPlaceholderText: Kiritish maydonlarini ularning placeholder matni asosida topish uchun foydalaning.
- getByText: Elementlarni ularning matn tarkibi asosida topish uchun foydalaning. Aniq bo'ling va bir nechta joyda paydo bo'lishi mumkin bo'lgan umumiy matndan foydalanishdan saqlaning.
- getByDisplayValue: Kiritish maydonlarini ularning joriy qiymati asosida topish uchun foydalaning.
Misol: Shakl Kiritishini Testlash
// Input.js
import React from 'react';
function Input({ label, placeholder, value, onChange }) {
return (
);
}
export default Input;
Uni tavsiya etilgan so'rov tartibida qanday testlash mumkinligi:
// Input.test.js
import React from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import Input from './Input';
describe('Input Component', () => {
it('updates the value when the user types', () => {
const handleChange = jest.fn();
render();
const inputElement = screen.getByLabelText('Name');
fireEvent.change(inputElement, { target: { value: 'John Doe' } });
expect(handleChange).toHaveBeenCalledTimes(1);
expect(handleChange).toHaveBeenCalledWith(expect.objectContaining({ target: { value: 'John Doe' } }));
});
});
Tushuntirish:
- `screen.getByLabelText('Name')`: "Name" yorlig'i bilan bog'liq kiritish maydonini topish uchun `getByLabelText`'dan foydalanadi. Bu kiritish joyini topishning eng qulay va foydalanuvchiga do'stona usulidir.
3. Amalga Oshirish Tafsilotlarini Testlashdan Qoching
Yuqorida aytib o'tilganidek, ichki holatni, funksiya chaqiruvlarini yoki maxsus CSS sinflarini testlashdan saqlaning. Bular o'zgarishi mumkin bo'lgan va mo'rt testlarga olib keladigan amalga oshirish tafsilotlaridir. Komponentning kuzatiladigan xatti-harakatlariga e'tibor qarating.
Misol: Holatni To'g'ridan-to'g'ri Testlashdan Qoching
Ma'lum bir holat o'zgaruvchisi yangilanganligini testlash o'rniga, komponent o'sha holatga asoslangan to'g'ri natijani ko'rsatayotganini testlang. Masalan, agar komponent mantiqiy holat o'zgaruvchisiga asoslangan xabarni ko'rsatsa, holat o'zgaruvchisining o'zini testlash o'rniga, xabar ko'rsatilgan yoki yashirilganligini testlang.
4. Maxsus Holatlar uchun `data-testid` dan Foydalaning
Odatda `data-testid` atributlaridan foydalanishdan qochish yaxshiroq bo'lsa-da, ular foydali bo'lishi mumkin bo'lgan maxsus holatlar mavjud:
- Semantik Ma'noga Ega Bo'lmagan Elementlar: Agar siz mazmunli rolga, yorliqqa yoki matnga ega bo'lmagan elementni nishonga olishingiz kerak bo'lsa, `data-testid` dan foydalanishingiz mumkin.
- Murakkab Komponent Tuzilmalari: Murakkab komponent tuzilmalarida `data-testid` sizga mo'rt selektorlarga tayanmasdan ma'lum elementlarni nishonga olishga yordam beradi.
- Maxsus Imkoniyatlarni Testlash: `data-testid` Cypress yoki Playwright kabi vositalar bilan maxsus imkoniyatlarni testlash paytida ma'lum elementlarni aniqlash uchun ishlatilishi mumkin.
Misol: `data-testid` dan foydalanish
// MyComponent.js
import React from 'react';
function MyComponent() {
return (
This is my component.
);
}
export default MyComponent;
// MyComponent.test.js
import React from 'react';
import { render, screen } from '@testing-library/react';
import MyComponent from './MyComponent';
describe('MyComponent', () => {
it('renders the component container', () => {
render( );
const containerElement = screen.getByTestId('my-component-container');
expect(containerElement).toBeInTheDocument();
});
});
Muhim: `data-testid` dan kamdan-kam hollarda va faqat boshqa so'rov usullari mos kelmaganda foydalaning.
5. Mazmunli Test Tavsiflarini Yozing
Aniq va qisqa test tavsiflari har bir testning maqsadini tushunish va nosozliklarni tuzatish uchun juda muhimdir. Test nima tekshirayotganini aniq tushuntiradigan tavsiflovchi nomlardan foydalaning.
Misol: Yaxshi va Yomon Test Tavsiflari
Yomon: `it('ishlaydi')`
Yaxshi: `it('to\'g\'ri salomlashish xabarini ko\'rsatadi')`
Yana ham yaxshiroq: `it('name prop taqdim etilmaganda "Hello, World!" salomlashish xabarini ko\'rsatadi')`
Yaxshiroq misol komponentning ma'lum sharoitlardagi kutilgan xatti-harakatlarini aniq bayon qiladi.
6. Testlaringizni Kichik va Maqsadli Saqlang
Har bir test komponent xatti-harakatining bitta jihatini tekshirishga qaratilgan bo'lishi kerak. Bir nechta stsenariylarni qamrab oladigan katta, murakkab testlarni yozishdan saqlaning. Kichik, maqsadli testlarni tushunish, qo'llab-quvvatlash va tuzatish osonroq.
7. Test Dublikatlaridan (Mocks va Spies) To'g'ri Foydalaning
Test dublikatlari siz testlayotgan komponentni uning bog'liqliklaridan ajratish uchun foydalidir. Tashqi xizmatlar, API chaqiruvlari yoki boshqa komponentlarni simulyatsiya qilish uchun moklar va josuslardan foydalaning.
Misol: API Chaqiruvini Moklash
// UserList.js
import React, { useState, useEffect } from 'react';
function UserList() {
const [users, setUsers] = useState([]);
useEffect(() => {
async function fetchUsers() {
const response = await fetch('/api/users');
const data = await response.json();
setUsers(data);
}
fetchUsers();
}, []);
return (
{users.map(user => (
- {user.name}
))}
);
}
export default UserList;
// UserList.test.js
import React from 'react';
import { render, screen, waitFor } from '@testing-library/react';
import UserList from './UserList';
global.fetch = jest.fn(() =>
Promise.resolve({
json: () => Promise.resolve([
{ id: 1, name: 'John Doe' },
{ id: 2, name: 'Jane Smith' },
]),
})
);
describe('UserList Component', () => {
it('fetches and displays a list of users', async () => {
render( );
// Wait for the data to load
await waitFor(() => screen.getByText('John Doe'));
expect(screen.getByText('John Doe')).toBeInTheDocument();
expect(screen.getByText('Jane Smith')).toBeInTheDocument();
});
});
Tushuntirish:
- `global.fetch = jest.fn(...)`: `fetch` funksiyasini oldindan belgilangan foydalanuvchilar ro'yxatini qaytarish uchun moklaydi. Bu sizga haqiqiy API endpointiga tayanmasdan komponentni testlash imkonini beradi.
- `await waitFor(() => screen.getByText('John Doe'))`: Hujjatda "John Doe" matni paydo bo'lishini kutadi. Bu zarur, chunki ma'lumotlar asinxron ravishda olinadi.
8. Chekka Holatlar va Xatoliklarni Ishlashni Testlang
Faqat "baxtli yo'lni" testlamang. Chekka holatlarni, xatolik stsenariylarini va chegara shartlarini testlashga ishonch hosil qiling. Bu sizga potentsial muammolarni erta aniqlashga yordam beradi va komponentingiz kutilmagan vaziyatlarni chiroyli tarzda boshqarishini ta'minlaydi.
Misol: Xatoliklarni Ishlashni Testlash
Tasavvur qiling, bir komponent API'dan ma'lumotlarni oladi va agar API chaqiruvi muvaffaqiyatsiz bo'lsa, xatolik xabarini ko'rsatadi. API chaqiruvi muvaffaqiyatsiz bo'lganda xatolik xabari to'g'ri ko'rsatilishini tekshirish uchun test yozishingiz kerak.
9. Maxsus Imkoniyatlarga E'tibor Qarating
Maxsus imkoniyatlar inklyuziv veb-ilovalarni yaratish uchun juda muhimdir. Komponentlaringizning maxsus imkoniyatlarini testlash va ularning WCAG kabi standartlarga javob berishini ta'minlash uchun RTL'dan foydalaning. Ba'zi asosiy e'tiborga olinadigan jihatlar:
- Semantik HTML: Kontentingizga tuzilma va ma'no berish uchun semantik HTML elementlaridan (masalan, `
- ARIA Atributlari: Elementlarning roli, holati va xususiyatlari haqida qo'shimcha ma'lumot berish uchun, ayniqsa maxsus komponentlar uchun ARIA atributlaridan foydalaning.
- Klaviatura Navigatsiyasi: Barcha interaktiv elementlarga klaviatura orqali kirish mumkinligiga ishonch hosil qiling.
- Rang Kontrasti: Ko'rish qobiliyati past foydalanuvchilar uchun matn o'qilishi mumkin bo'lishini ta'minlash uchun yetarli rang kontrastidan foydalaning.
- Ekran O'quvchi Muvofiqligi: Vizual nuqsonlari bo'lgan foydalanuvchilar uchun mazmunli va tushunarli tajriba taqdim etishini ta'minlash uchun komponentlaringizni ekran o'quvchi bilan testlang.
Misol: `getByRole` yordamida Maxsus Imkoniyatlarni Testlash
// MyAccessibleComponent.js
import React from 'react';
function MyAccessibleComponent() {
return (
);
}
export default MyAccessibleComponent;
// MyAccessibleComponent.test.js
import React from 'react';
import { render, screen } from '@testing-library/react';
import MyAccessibleComponent from './MyAccessibleComponent';
describe('MyAccessibleComponent', () => {
it('renders an accessible button with the correct aria-label', () => {
render( );
const buttonElement = screen.getByRole('button', { name: 'Close' });
expect(buttonElement).toBeInTheDocument();
});
});
Tushuntirish:
- `screen.getByRole('button', { name: 'Close' })`: "Close" nomli qulay nomga ega tugma elementini topish uchun `getByRole`'dan foydalanadi. Bu tugmaning ekran o'quvchilar uchun to'g'ri yorliqlanganligini ta'minlaydi.
10. Testlashni Ishlab Chiqish Jarayoniga Integratsiya Qiling
Testlash keyin o'ylanadigan ish emas, balki ishlab chiqish jarayonining ajralmas qismi bo'lishi kerak. Kod topshirilganda yoki joylashtirilganda testlarni avtomatik ravishda ishga tushirish uchun testlaringizni CI/CD quvuringizga integratsiya qiling. Bu sizga xatoliklarni erta aniqlashga va regressiyalarning oldini olishga yordam beradi.
11. Mahalliylashtirish va Xalqarolashtirishni (i18n) Hisobga Oling
Global ilovalar uchun testlash paytida mahalliylashtirish va xalqarolashtirishni (i18n) hisobga olish juda muhim. Komponentlaringiz turli tillarda va hududlarda to'g'ri render qilinishiga ishonch hosil qiling.
Misol: Mahalliylashtirishni Testlash
Agar siz mahalliylashtirish uchun `react-intl` yoki `i18next` kabi kutubxonadan foydalanayotgan bo'lsangiz, komponentlaringiz to'g'ri tarjima qilingan matnni ko'rsatishini tekshirish uchun testlaringizda mahalliylashtirish kontekstini moklashingiz mumkin.
12. Qayta Ishlatiladigan Sozlash uchun Maxsus Render Funksiyalaridan Foydalaning
Kattaroq loyihalar ustida ishlaganda, siz bir nechta testlarda bir xil sozlash bosqichlarini takrorlayotganingizni ko'rishingiz mumkin. Takrorlanishni oldini olish uchun umumiy sozlash mantig'ini o'z ichiga olgan maxsus render funksiyalarini yarating.
Misol: Maxsus Render Funksiyasi
// test-utils.js
import React from 'react';
import { render } from '@testing-library/react';
import { ThemeProvider } from 'styled-components';
import theme from './theme';
const AllTheProviders = ({ children }) => {
return (
{children}
);
}
const customRender = (ui, options) =>
render(ui, { wrapper: AllTheProviders, ...options })
// re-export everything
export * from '@testing-library/react'
// override render method
export { customRender as render }
// MyComponent.test.js
import React from 'react';
import { render, screen } from './test-utils'; // Import the custom render
import MyComponent from './MyComponent';
describe('MyComponent', () => {
it('renders correctly with the theme', () => {
render( );
// Your test logic here
});
});
Ushbu misol komponentni ThemeProvider bilan o'rab oladigan maxsus render funksiyasini yaratadi. Bu sizga har bir testda ThemeProvider sozlamasini takrorlamasdan, temaga tayanadigan komponentlarni osongina testlash imkonini beradi.
Xulosa
React Testing Library komponentlarni testlash uchun kuchli va foydalanuvchiga yo'naltirilgan yondashuvni taklif etadi. Ushbu eng yaxshi amaliyotlarga rioya qilish orqali siz foydalanuvchi xatti-harakatlari va maxsus imkoniyatlarga e'tibor qaratadigan, qo'llab-quvvatlanadigan, samarali testlarni yozishingiz mumkin. Bu global auditoriya uchun yanada mustahkam, ishonchli va inklyuziv React ilovalariga olib keladi. Foydalanuvchi o'zaro ta'sirlarini ustuvor qo'yishni, amalga oshirish tafsilotlarini testlashdan qochishni, maxsus imkoniyatlarga e'tibor qaratishni va testlashni ishlab chiqish jarayoniga integratsiya qilishni unutmang. Ushbu prinsiplarni qabul qilish orqali siz butun dunyo bo'ylab foydalanuvchilarning ehtiyojlarini qondiradigan yuqori sifatli React ilovalarini yaratishingiz mumkin.
Asosiy xulosalar:
- Foydalanuvchi Harakatlariga E'tibor Qarating: Komponentlarni foydalanuvchi ular bilan qanday munosabatda bo'lishini testlang.
- Maxsus Imkoniyatlarni Ustuvor Qo'ying: Komponentlaringiz nogironligi bo'lgan foydalanuvchilar uchun qulay ekanligiga ishonch hosil qiling.
- Amalga Oshirish Tafsilotlaridan Qoching: Ichki holat yoki funksiya chaqiruvlarini testlamang.
- Aniq va Qisqa Testlar Yozing: Testlaringizni tushunish va qo'llab-quvvatlashni osonlashtiring.
- Testlashni Ish Jarayoniga Integratsiya Qiling: Testlaringizni avtomatlashtiring va ularni muntazam ravishda ishga tushiring.
- Global Auditoriyani Hisobga Oling: Komponentlaringiz turli tillarda va hududlarda yaxshi ishlashiga ishonch hosil qiling.